package com.scau.database.enums;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

/**
 * @author yannick
 * @date 2019-08-25 15:58
 */
@JsonSerialize(using = JsonEnumSerializer.class)
public interface BaseEnum {
    /**
     * 是否属于这个值
     *
     * @param enumObj
     * @param value
     * @return
     */
    static <T extends BaseEnum> boolean check(T enumObj, Integer value) {
        return enumObj.getType().equals(value);
    }

    /**
     * 获取枚举集合
     *
     * @param clazz
     * @return
     */
    static <T extends BaseEnum> T[] values(Class<T> clazz) {
        if (!clazz.isEnum()) {
            throw new IllegalArgumentException("Class[" + clazz + "]不是枚举类型");
        }
        //得到values
        return clazz.getEnumConstants();
    }


    /**
     * 获取枚举,区分大小写
     *
     * @param clazz
     * @param type
     * @return
     */
    static <T extends BaseEnum> T typeOf(Class<T> clazz, Integer type) {

        return typeOf(clazz, type, false);
    }

    /**
     * 获取枚举,区分大小写
     *
     * @param clazz
     * @param type
     * @param ignoreCase
     * @return
     */
    static <T extends BaseEnum> T typeOf(Class<T> clazz, Integer type, boolean ignoreCase) {

        //得到values
        T[] enums = values(clazz);

        if (enums == null || enums.length == 0) {
            return null;
        }

        for (T t : enums) {
            if (ignoreCase && t.getType().equals(type)) {
                return t;
            } else if (t.getType().equals(type)) {
                return t;
            }
        }
        return null;
    }



    /**
     * 获取type
     *
     * @return
     */
    Integer getType();

    /**
     * 获取描述
     *
     * @return
     */
    String getDescription();
}
